package cn.good.yan.b1;

import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Random;

/**
 *  b1. 基础常识
 *      1  JAVA的变量
 *      2  this 对象
 *      3  static
 *      4  final
 *      5  自动装箱
 *      6  Math
 *
 *      8  类型转换
 *      9  System 和 Runtime
 *      10 BigInteger BigDecimal
 *      11 try catch
 * @author shengren.yan
 * @create 2023-07-18
 */
public class TestAll {

    public static final String SO_YES = "解决方案";

    /**
     * 1 JAVA的变量
     *      基本类型：byte、short、int、long  float、double、char、boolean
     *      引用类型：class、array、interface、enum、annotation、record（记录）
     * 2  this 对象：（谁调用，谁就是当前对象）
     * 3  static 静态的 （所有变量被实例共享，内存空间只存一份，jdk8之后静态的也放在堆中，不再方法区中（原空间））
     * 4  final 不能被重写、继承
     * 5  自动装箱
     *      Integer in1 =100;  Integer in2 =100; // in1 = in2 true 如果大于127，为false  因为Integer默认缓存是127，超过就new 对象
     *      BigInteger b = new BigInteger("1");  // 比 Integer 精度更大
     *      BigDecimal bd = new BigDecimal(1);   // 小数的精度
     * 6 Math
     *      Math.ceil(11.2);  // 向上取整  12
     *      Math.floor(11.2); // 向下取整  11
     *      Math.round(11.2); // 四舍五入  11
     *      Math.abs(11.3);   // 绝对值
     *      Math.max(11,12);  // 返回最大的数
     *      Math.min(11,12);  // 返回最小的数
     *      Math.random();    // 返回随机数  0 - 1 直接的小数
     *      int i = (int) Math.random() * 100;  // 生产 1 - 100 的随机数
     * 7 泛型  b7方法中
     */
    public void b1() {
        // 3 static 静态的不依赖对象
        T3 t1 = null;
        // t1.t3(); 如果是static修饰，静态方法不会报空指针
    }

    // 3 static 的联系
    private static Integer num = 0;
    static {
        // 可初始化 - 数据
        num = 1;
    }

    // Math
    public void b6() {
        Math.ceil(11.2);   // 向上取整  12
        Math.floor(11.2);  // 向下取整  11
        Math.round(11.2);  // 四舍五入  11
        Math.abs(11.3);    // 绝对值
        Math.max(11, 12);  // 返回最大的数
        Math.min(11, 12);  // 返回最小的数
        Math.random();     // 返回随机数  0 - 1 直接的小数
        int i = (int) Math.random() * 100;  // 生产 1 - 100 的随机数
    }

    // 8 类型转换
    public void b8() {
        // int TO String
        int i1 = Integer.parseInt("2");
        String s1 = String.valueOf(i1);

        // intern TO String
        Integer i2 = (Integer) Integer.parseInt("3");
        String s2 = String.valueOf(i2);

        // int TO Integer转换
        int i3 = (int) i2;
        Integer s3 = (Integer) i3;
        // System.out.println(s3);

        // long和String互相转换的方法
        long i4 = 3l;
        String s4 = String.valueOf(i4);
        i4 = Long.parseLong(s4);
        // System.out.println(i4);

        // int 转long
        long i5= (long) i3;
        int l5 = (int) i5;
        //  System.out.println(i5);
        Long a6 = 10L;
        int b6 = a6.intValue();
        // System.out.println(b6);

        // Integer 转long
        long i7= (long) i2;
        // System.out.println(i7);
        Integer l7 = (int) i7;
        // System.out.println(l7);
        Long a = 10L;
        Integer bb = a.intValue();
    }

    /**
     * b9 System 和 Runtime
     */
    public void b9(){
        System.out.println("JDK版本：" + System.getProperty("java.version"));
        System.out.println("系统名：" + System.getProperty("os.name"));
        System.out.println("系统版本：" + System.getProperty("os.version"));
        System.out.println("用户名：" + System.getProperty("user.name"));
        System.out.println("用户目录：" + System.getProperty("user.home"));
        System.out.println("当前项目目录：" + System.getProperty("user.dir"));

        Runtime runtime = Runtime.getRuntime();
        // 物理内存
        System.out.println("获取虚拟堆内存总量" + runtime.totalMemory() / 1024 / 2024 * 64 + " MB");
        System.out.println("获取最大堆内存总量" + runtime.maxMemory() / 1024 / 2024 * 4 + " MB");
        System.out.println("获取虚拟机空闲内存总量" + runtime.freeMemory() / 1024 / 2024  + " MB");
    }

    /**
     * b10 BigInteger BigDecimal
     */
    public void b10(){
        // 如果Integer装不下，使用BigInteger
        BigInteger b = new BigInteger("111");
        // 小数的
        BigDecimal b1 = new BigDecimal("111");
        // 返回随机数
        Random r = new Random();
        boolean b2 = r.nextBoolean();
        System.out.println(b2);
        System.out.println(r.nextDouble());
        System.out.println(r.nextFloat());
        System.out.println(r.nextGaussian());
        System.out.println(r.nextInt(20));  // 有参代表获取 0 到 20 的数
        System.out.println(r.nextLong());

    }

    /**
     * b11 try catch
     */
    public void b11() {
        try (InputStreamReader reader2 = new InputStreamReader(System.in)) {
            reader2.read();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        TestAll testAll = new TestAll();
//        testAll.b9();
        testAll.b10();
    }
}


/**
 * static 静态的类
 */
class T3 {
    public static void t3() {
        System.out.println("static 静态的方法");
    }
}
